package com.qf.listener;


import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queues = "queue_demo01")
public class MyRabbitListener {

//    @RabbitHandler
//    public void msg(String message){
//        System.out.println("消费端接收的消息为：" + message);
//    }

    @RabbitHandler
    public void msg(Message message, Channel channel, String msg){
        //接收消息
        System.out.println("消费端接收的消息为：" + msg);
        try {
        //处理本地业务
            System.out.println("处理本地业务开始======start======");
            Thread.sleep(2000);
            //int i = 10 / 0;
            System.out.println("处理本地业务结束======end======");
        //签收消息
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
            //ack表示确认消息。multiple：false只确认该delivery_tag的消息，true确认该delivery_tag的所有消息
        }catch (Exception e){
            e.printStackTrace();
            //如果出现异常，则拒绝消息 可以重回队列 也可以丢弃 可以根据业务场景来
            try {
                if (message.getMessageProperties().getRedelivered()){
                    //消息已经重新投递，不需要再次投递
                    System.out.println("已经投递一次了");
                }else {

                    channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);
                }

                //channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);
                //nack表示拒绝消息,批量处理。multiple表示拒绝指定了delivery_tag的所有未确认的消息，requeue表示不是重回队列
                //channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);
                //Reject表示拒绝消息,不批量处理。requeue：false表示被拒绝的消息是丢弃；true表示重回队列
            }catch (Exception e1){
                e1.printStackTrace();
            }
        }

    }

}
